package 回显程序2;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class TcpEchoClient {
    private Socket socket=null;
    private String serverIp;
    private int serverPort;

    public TcpEchoClient(String serverIp,int serverPort) throws IOException {
        this.serverIp=serverIp;
        this.serverPort=serverPort;

        // socket 创建的同时向其构造方法中传入服务器IP和端口
        // 当客户端启动就会调用socket的构造方法，在构造方法中就和服务器尝试建立连接
        this.socket=new Socket(serverIp,serverPort);
    }

    public void start() {
        Scanner scanner=new Scanner(System.in);
        try(InputStream inputStream=socket.getInputStream();
            OutputStream outputStream=socket.getOutputStream()) {
            while (true) {
                //1.读取用户输入的内容
                System.out.print("->");
                String request=scanner.next();// 客户端这里的next()进入阻塞，等待用户从键盘输入
                if (request.equals("exit")) {
                    System.out.println("程序退出！");
                    break;
                }

                //debug
                //System.out.println("["+request+"]");

                //2.将用户输入的内容构造成请求，发送给服务器
                PrintWriter printWriter=new PrintWriter(outputStream);//需要将请求 写入IO设备
                printWriter.println(request);//发送request
                //使用 println，因为服务器的next()在读取时需要读到空白符才能返回(空白符:\n,空格,\t,翻页符...)
                //println 可能把数据写到缓冲区中，至于是否真的写到IO设备中是不确定的，没有写入IO设备那数据就不能通过网卡来发送
                //因此我们需要人为进行flush刷新缓冲区
                printWriter.flush();

                //3.从服务器中读取响应并解析
                Scanner responseScanner=new Scanner(inputStream);
                String response = responseScanner.next();
                //客户端发送完请求后，会在这个next进行阻塞等待来自服务器的响应数据，next()在读取时需要读到空白符才能返回

                //4.将响应显示
                String log=String.format("request:%s  response:%s",request,response);
                System.out.println(log);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws IOException {
        TcpEchoClient client=new TcpEchoClient("127.0.0.1",9090);//传入 服务器的IP和端口
        client.start();
    }
}
